
#include "keys.h"
#include "SDL.h"
#include "coid/comm/hptimer.h"

////////////////////////////////////////////////////////////////////////////////
static tOnKey_cbk   _OnKeyDown = 0;
static tOnKey_cbk   _OnKeyUp = 0;
static tOnKey_cbk   _OnKey = 0;


////////////////////////////////////////////////////////////////////////////////
void teximage_cbk_onkeydown( tOnKey_cbk cbk )
{
    _OnKeyDown = cbk;
}

void teximage_cbk_onkeyup( tOnKey_cbk cbk )
{
    _OnKeyUp = cbk;
}

void teximage_cbk_onkey( tOnKey_cbk cbk )
{
    _OnKey = cbk;
}


////////////////////////////////////////////////////////////////////////////////
#define INVOKE_CB( CBF, P )     if(CBF)  CBF P;

static uint kbrep_delay = 0;
static uint kbrep_secnddelay = 30;
static uint kbrep_firstdelay = 300;
static bool kbrep_check = false;
static MsecTimer kbrep_tick;

void set_repeat_delay( uint delay_msec, uint firstdelay_msec )
{
    kbrep_secnddelay = delay_msec;
    kbrep_firstdelay = firstdelay_msec;
}

void teximage_process_events()
{
    SDL_Event ev;
    static SDL_Event evrep;

    while( SDL_PollEvent(&ev) )
    {
        switch(ev.type)
        {
        case SDL_KEYDOWN:
            if(kbrep_secnddelay)
            {
                kbrep_tick.reset();
                kbrep_check = true;
                kbrep_delay = kbrep_firstdelay;
                evrep = ev;
            }
            INVOKE_CB( _OnKeyDown, ( ev.key.keysym.sym ) );
            INVOKE_CB( _OnKey, ( ev.key.keysym.sym ) );
            return;


        case SDL_KEYUP:
            kbrep_check = false;
            INVOKE_CB( _OnKeyUp, ( ev.key.keysym.sym ) );
            return;
        }
    }

    if( kbrep_check && kbrep_tick.time() >= kbrep_delay )
    {
        kbrep_tick.reset();
        kbrep_delay = kbrep_secnddelay;
        INVOKE_CB( _OnKey, ( evrep.key.keysym.sym ) );
    }
}

////////////////////////////////////////////////////////////////////////////////

